/* 

给你一个有序数组 nums ，请你 原地 删除重复出现的元素，使每个元素 只出现一次 ，返回删除后数组的新长度。
不要使用额外的数组空间，你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。

示例：
输入：nums = [1,1,2]
输出：2, nums = [1,2]
解释：函数应该返回新的长度 2 ，并且原数组 nums 的前两个元素被修改为 1, 2 。不需要考虑数组中超出新长度后面的元素。

*/

/* 
注意是有序数组

思路：双指针

*/

/**
 * @param {number[]} nums
 * @return {number}
 */
 var removeDuplicates = function(nums) {
    let n=nums.length
    if(n==0||n==1)return n
    // 声明两个指针fast、slow
    // fast往后找元素，与fast-1比较，slow记录fast找出的不同的元素
    let fast=1,slow=1
    while(fast<n){
        // fast指针与前一项不一样
        if(nums[fast]!=nums[fast-1]){
            // 用slow记录此时fast指向的值
            nums[slow]=nums[fast]
            // slow往后移
            ++slow
        }
        // fast每次往后移
       ++fast
    }
    // return slow  // 去重后的数组长度
    return  nums.splice(0,slow)  // 去重后的数组
};

/* 
时间复杂度：O(n)，其中 n 是数组的长度。快指针和慢指针最多各移动 n 次。

空间复杂度：O(1)。只需要使用常数的额外空间。
*/

// 运行

let nums = [0,0,1,1,1,2,2,3,3,4]
console.log(removeDuplicates(nums));
